package com.taldh.design.patterns.proxy.dynamic.cglibmixin;

import net.sf.cglib.proxy.Mixin;

import java.lang.reflect.Method;


public class MixinDemo {

    public static void main(String[] args) {

        //CGLIB的代理包net.sf.cglib.proxy.Mixin类提供对Minix编程的支持。Minix允许多个对象绑定到一个单个的大对象上。
        //在代理中对方法的调用委托到下面相应的对象中。 这是一种将多个接口混合在一起的方式, 实现了多个接口。
        //
        //Minix是一种多继承的替代方案, 很大程度上解决了多继承的很多问题, 实现和理解起来都比较容易。

        //接口数组

        Class<?>[] interfaces = new Class[] { MyInterfaceA.class, MyInterfaceB.class };

          

        //实例对象数组

        Object[] delegates = new Object[] { new MyInterfaceAImpl(), new MyInterfaceBImpl() };

          

        //Minix组合为o对象。

        Object o = Mixin.create(interfaces, delegates);

          

        MyInterfaceA a = (MyInterfaceA) o;

        a.methodA();

          

        MyInterfaceB b = (MyInterfaceB) o;

        b.methodB();

          

        System.out.println("\r\n 输出Mixin对象的结构...");

        Class clazz = o.getClass();

        Method[] methods = clazz.getDeclaredMethods();

        for (int i = 0; i < methods.length; i++) {

            System.out.println(methods[i].getName());

        }

        System.out.println(clazz);

    }

}

 

interface MyInterfaceA {

    public void methodA();

}

 

interface MyInterfaceB {

    public void methodB();

}

 

class MyInterfaceAImpl implements MyInterfaceA {

    @Override

    public void methodA() {

        System.out.println("MyInterfaceAImpl.methodA()");

    }

}

 

class MyInterfaceBImpl implements MyInterfaceB {

    @Override

    public void methodB() {

        System.out.println("MyInterfaceBImpl.methodB()");

    }

}